home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d3
/
ddjhptxt.arc
/
SCHULMAN.LST
< prev
next >
Wrap
File List
|
1990-06-05
|
5KB
|
194 lines
LISTING ONE
; protmode.asm -- 286 protected-mode instructions
; requires MASM 5.0 or higher or TASM
; masm -ml protmode;
; or, tasm -ml protmode;
dosseg
.286p
.model large
.code
public _lsl, _lar, _verr, _verw, _sgdt, _sidt, _sldt
; extern unsigned far lsl(unsigned short sel);
; input: selector
; output: if valid and visible at current protection level,
; return segment limit (which is 0 for 1-byte seg!)
; else
; return 0
;
_lsl proc
enter 0, 0
sub ax, ax
lsl ax, [bp+6]
leave
ret
_lsl endp
; extern unsigned short far lar(unsigned short sel);
; input: selector
; output: if valid and visible at current protection level,
; return access rights (which will never be 0)
; else
; return 0
;
_lar proc
enter 0, 0
sub ax, ax
lar ax, [bp+6]
shr ax, 8
leave
ret
_lar endp
; extern BOOL far verr(unsigned short sel);
; input: selector
; output: valid for reading ? 1 : 0
;
_verr proc
enter 0, 0
mov ax, 1
verr word ptr [bp+6]
je short verr_okay
dec ax
verr_okay:
leave
ret
_verr endp
; extern BOOL far verw(unsigned short sel);
; input: selector
; output: valid for writing ? 1 : 0
;
_verw proc
enter 0, 0
mov ax, 1
verw word ptr [bp+6]
je short verw_okay
dec ax
verw_okay:
leave
ret
_verw endp
; extern void far sgdt(void far *gdt);
; input: far ptr to 6-byte structure
; output: fills structure with GDTR
;
_sgdt proc
enter 0, 0
les bx, dword ptr [bp+6]
sgdt fword ptr es:[bx]
leave
ret
_sgdt endp
; extern void far sidt(void far *idt);
; input: far ptr to 6-byte structure
; output: fills structure with IDTR
;
_sidt proc
enter 0, 0
les bx, dword ptr [bp+6]
sidt fword ptr es:[bx]
leave
ret
_sidt endp
;
; extern unsigned short sldt(void);
; input: none
; output: Local Descriptor Table register (LDTR)
;
_sldt proc
sldt ax
ret
_sldt endp
end
LISTING TWO
/* PROTMODE.H */
typedef enum { FALSE, TRUE } BOOL;
#ifdef InstantC
unsigned far lsl(unsigned short sel) {extern;}
unsigned short far lar(unsigned short sel) {extern;}
BOOL far verr(unsigned short sel) {extern;}
BOOL far verw(unsigned short sel) {extern;}
void far sgdt(void far *gdt) {extern;}
void far sidt(void far *idt) {extern;}
unsigned short sldt(void) {extern;}
#else
extern unsigned far lsl(unsigned short sel);
extern unsigned short far lar(unsigned short sel);
extern BOOL far verr(unsigned short sel);
extern BOOL far verw(unsigned short sel);
extern void far sgdt(void far *gdt);
extern void far sidt(void far *idt);
extern unsigned short sldt(void);
#endif
LISTING THREE
/* BROWSE.C */
#ifdef InstantC
#loadobj "protmode.obj"
#endif
#include "protmode.h"
void browse()
{
unsigned long addr;
unsigned i, acc;
for (i=0; i<0xFFFF; i++) // for all possible selectors
if (acc = lar(i)) // if a valid selector
{
addr = D16AbsAddress(MK_FP(i,0));
printf("%04X %06lX LAR=%02X LSL=%04X PL=%02X %s %s %s %s\n",
i, // selector
addr, // physical base addr
acc, // access-rights byte
lsl(i), // segment limit
i & 3, // protection level
verr(i) ? "VERR" : " ", // readable?
verw(i) ? "VERW" : " ", // writeable?
i & 4 ? "LDT" : "GDT", // which table?
i == addr >> 4 ? "TRANS" : ""); // transparent?
}
}
LISTING FOUR
/* SEL.C */
void sel(void far *fp)
{
extern DESCRIPTOR far *gdt;
extern DESCRIPTOR far *ldt;
unsigned seg = FP_SEG(fp);
unsigned index = seg >> 3;
DESCRIPTOR far *dt = (seg & 4) ? gdt : ldt; // table indicator
ACCESS_RIGHTS *pacc = (ACCESS_RIGHTS *) &dt[index].access;
printf("SEL=%04X ADDR=%02X%04X LIMIT=%04X ACCESS=%d%c%c%c%c%c%c\n",
seg, dt[index].addr_hi, dt[index].addr_lo, dt[index].limit,
// display access rights as if they were file attributes:
pacc->dpl,
pacc->accessed ? 'a' : '-',
pacc->read_write ? ((pacc->code_data) ? 'r' : 'w') : '-',
pacc->conf_exp ? ((pacc->code_data) ? 'f' : 'e') : '-',
pacc->code_data ? 'c' : 'd',
pacc->xsystem ? '-' : 's',
pacc->present ? 'p' : '-');
}